package _3TCPChat;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

//服务器功能类
public class ChatServer {

	// 服务器端口
	int port = 8888;

	// 界面窗体
	ChatServerFrame f;

	// 容器存放所有连接上的客户端的Socket
	List<Socket> clients = new ArrayList<>();;

	// 启动服务器
	public void start() {

		// 开启一个新的子线程，在子线程中启动服务器，不会卡主界面
		Thread t = new Thread(new Runnable() {

			@Override
			public void run() {

				// 1. 创建服务器Scoket
				ServerSocket serSocket;
				try {
					f.showMsg("开启服务器,端口:" + port);
					serSocket = new ServerSocket(port);
				} catch (IOException e) {
					f.showMsg("出错了:" + e.getMessage());
					return;
				}

				// 2. 不断监听端口，等待客户端连接
				while (true) 
				{
					try {

						f.showMsg("监听端口,等待客户连入...");
						Socket s = serSocket.accept();

						// 3. 显示客户端信息
						f.showMsg("客户端连入" + s.getInetAddress() + ":" + s.getPort());

						// 处理当前连入的客户端Scoket
						handleScoket(s);

						// 加入到客户端里里列表
						clients.add(s);

						f.showMsg("当前在线用户:" + clients.size());
						// 
						sendAll("当前在线用户:" + clients.size());

					} catch (IOException e) {
						f.showMsg("出错了:" + e.getMessage());
					}
				}
			}
		});
		t.start();

	}
	
	// 给所有的客户端发信息
	public void sendAll(String msg)
	{
		// 转发给所有的客户端
		for(Socket s:clients)
		{
			// 得到输出流
			OutputStream out;
			try {
				out = s.getOutputStream();
				// 向流中写入数据
				out.write(msg.getBytes());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	}

	// 处理某个连入的客户端Socket
	protected void handleScoket(Socket s) 
	{
		// 开子线程不停读取这个客户端发来的信息		
			
			Thread t = new Thread(new Runnable() {

				@Override
				public void run() {

					// 从socket得到输入流
					InputStream in=null;
					try {
						in = s.getInputStream();
					} catch (IOException e1) {
						return;
					}
					while (true) {
						
						// 读取数据
						byte[] buf = new byte[1024];
						int len;
						try {
							len = in.read(buf);
							if (len == -1) 
							{
								f.showMsg("读到长度-1");
								break;
							}
							// 
							String str = new String(buf, 0, len);
							String msg = s.getInetAddress() + "[" + s.getPort() + "]:" + str;
							f.showMsg(msg);
							
							// 转发给所有的客户端
							sendAll(msg);
							
							
						} catch (IOException e) {
							f.showMsg("出错了或客户端断开了:"+e.getMessage());
							break;
						}
					}
					f.showMsg(s.getInetAddress() + "[" + s.getPort() + "]:客户端断开或出错了");
					
					// 从客户端列表中移出
					clients.remove(s);
					f.showMsg("当前在线用户:"+clients.size());
					
					sendAll("当前在线用户:"+clients.size());
					
				}
			});
			t.start();


	}

}